import cv2 as cv
import numpy as np


# 人脸检测的步骤
#     (1)加载分类器,分类器事先要放在工程目录中去
#     (2)调用detectMultiScale()函数检测，调整函数的参数可以使检测结果更加精确
#     (3)把检测到的人脸等用矩形（或者圆形等其他图形）画出来
def face_detection_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    face_detector = cv.CascadeClassifier("D:/opencv_source/opencv-master/opencv-master/data/haarcascades/haarcascade_frontalface_alt_tree.xml")
    # 级联分类器，新版opencv既支持haar，又支持lbp特征
    face = face_detector.detectMultiScale(gray, 1.1, 2)
    # 参数image表示的是要检测的输入图像
    # 参数scaleFactor表示在前后两次相继的扫描中，搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;一般设置为1.1
    # 参数minNeighbors表示每一个级联矩形应该保留的邻近个数，默认为3。minNeighbors控制着误检测，默认值为3表明至少有3次重叠检测，我们才认为人脸确实存在。
    # 检出的结果就是一个一个的矩形框（人脸），矩形框由4个值表示，（x,y）是矩阵左上点的坐标，w和h分别是矩阵的宽高，则矩阵右下点的坐标是（x+w,y+h）
    for x, y, w, h in face:
        cv.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
    cv.imshow("result", image)


# 基于图片的人脸识别
# src = cv.imread("imgs/test012.jpg")
# cv.imshow("bozi", src)


# 基于摄像头的人脸识别
capture = cv.VideoCapture(0)
while True:
    ret, frame = capture.read()
    frame = cv.flip(frame, 1)
    face_detection_demo(frame)
    c = cv.waitKey(50)
    if c == 27:
        break
cv.waitKey(0)
cv.destroyAllWindows()



